package API.BigDecimalDome;

import java.math.BigDecimal;

/**
 * ClassName:BigDecimalText002
 * Package:API.BigDecimalDome
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/1/31-16:44
 * @Version:v1.0
 */
public class BigDecimalText002 {
    public static void main(String[] args) {
        /*
        表示较大的小数和解决小数运算精度失真问题

        * 构造方法获取BigDecimal对象
        *   public BigDecimal(double val)
        *   public BigDecimal(String val)
        *
        * 静态方法获取BigDecimal对象
        *   public static BigDecimal valueOf(double val)
        * */


        //通过传递double类型的小数来创建对象
        //注意：这种方式有可能是不精确的,所以不建议使用
//        BigDecimal bd1 = new BigDecimal(0.01);
//        BigDecimal bd2 = new BigDecimal(0.09);
//        BigDecimal add1 = bd1.add(bd2);
//        System.out.println(add1);//0.0899999999999999966693309261245303787291049957275390625
//        System.out.println(bd1);//0.01000000000000000020816681711721685132943093776702880
//        System.out.println(bd2);//0.0899999999999999966693309261245303787291049957275390625
//
//
//        //通过传递字符串表示的小数来创建对象
//        BigDecimal bd3 = new BigDecimal("0.001");
//        BigDecimal bd4 = new BigDecimal("0.09");
//        BigDecimal add = bd3.add(bd4);
//        System.out.println(bd3);//0.001
//        System.out.println(bd4);//0.09
//        System.out.println(add);//0.091

        //通过静态方法获取对象
        BigDecimal bd5 = BigDecimal.valueOf(10);
        BigDecimal bd6 = BigDecimal.valueOf(1111.1111);
        System.out.println(bd5);//10
        System.out.println(bd6);//1111.1111


        /*
        * 1.如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
        * 2.如果要表示的数字较大,超出了double的取值范围,建议使用构造方法
        * 3.如果我们传递的是0~10之间的整数,包含0,也包含10，男方法会返回已经创建好的对象,不需要重新new
        * */
        BigDecimal bd7 = BigDecimal.valueOf(10);
        BigDecimal bd8 = BigDecimal.valueOf(10);
        BigDecimal bd9 = BigDecimal.valueOf(10.0);
        System.out.println(bd7 == bd8);//true
        System.out.println(bd7 == bd9);//false


    }
}
